# 使用 Pydantic 模型


from typing import Optional
from fastapi import FastAPI
import uvicorn
from pydantic import BaseModel

app = FastAPI()


# 自定义一个Pydantic 模型
class Item(BaseModel):
    name: str
    desc: Optional[str] = None
    price: float
    tax: Optional[float] = None


@app.post('/items')
# item 参数的类型指定为Item模型
async def create_item(item: Item):
    return item


'''
    参数指定为 Pydantic 模型后，FastAPI 做了这几件事
    1、将请求体识别为 JSON 字符串
    2、将字段值转换相应的类型（若有需要）
    3、验证数据，如果验证失败，会返回一个清晰的错误，准确指出错误数据的位置和信息
    4、item 会接收到完整的请求体数据，拥有所有属性及其类型，IDE 也会给予对应的智能提示
    5、给 Pydantic 模型自动的生成 JSON Schema，这些 Schema 会成为生成 OpenAPI Schema 的一部分，并显示在接口文档上
'''

'''
    字段值类型自动转换
     name: str  传了 bool 类型的数据
     description: str  传了 float 类型的数据
     price: float   传了 int 类型的数据
     tax: float  传了 bool 类型的数据
     
     如果转换失败，则会报 type_error 错误
'''


@app.post('/items2')
# item 参数的类型指定为Item模型
async def create_item(item: Item):
    # item.name.replace()
    ...  # IDE 智能提示   因为知道 name 属性的类型是 str，所以 IDE 会智能提示 str 内置的方法


if __name__ == '__main__':
    uvicorn.run(app='main2:app', host='127.0.0.1', port=8000, debug=True, reload=True)
